import heapq

nums = [22,-10,-4,-523,5221,32,657,233,476,9,4,555,6,9,3,6,8,97,78,99]
heap = list(nums)
# 将列表堆化
heapq.heapify(heap)
print(heap)
#获取其中第一小的元素
print(heapq.heappop(heap))
#获取其中第二小的元素
print(heapq.heappop(heap))
#获取其中第三小的元素
print(heapq.heappop(heap))


# 获取最大三个数值
print(heapq.nlargest(3,nums))
# 获取最小的三个数值
print(heapq.nsmallest(3,nums))
# 如果只求一个最大/小 值，适合 min/max 
print('最小值：',min(nums))
print('最大值：',max(nums))

#如果获取的元素过多，或者与集合相近，适合用 sorted(items) 排序后，然后切片
min10 = sorted(nums)[:10]
print('最小的前十个值：',min10)
max10 = sorted(nums,reverse=True)[:10]
print('最大前十个值：',max10)

portfolio = [
    {'name':'IBM', 'shares':100, 'price':91.1},
    {'name':'AAPL', 'shares':50, 'price':543.22},
    {'name':'FB', 'shares':200, 'price':21.09},
    {'name':'HPQ', 'shares':35, 'price':31.75},
    {'name':'YHOO', 'shares':45, 'price':16.35},
    {'name':'ACME', 'shares':75, 'price':115.65}
]

# key 是一个function ，用于从每个输入元素提取比较键，默认为None。用于从迭代中的每个元素提取比较键
# 其中的 lambda s:s['price'] 中的 s 代表的是 porfolio 中的每一个 dict 
cheap = heapq.nsmallest(2, portfolio, key= lambda s : s['price'])
print(cheap)

# 相当与上面的 匿名函数的用法
def key(item):
    return item['price']
cheap = heapq.nsmallest(2, portfolio, key=key)
print(cheap)

# key 是一个function ，用于从每个输入元素提取比较键，默认为None。用于从迭代中的每个元素提取比较键
# 其中的 lambda s:s['price'] 中的 s 代表的是 porfolio 中的每一个 dict 
expensive = heapq.nlargest(2,portfolio,key=lambda s : s['price'])
print(expensive)
expensive = heapq.nlargest(2,portfolio,key=key)
print(expensive)